package cn.itcast.documentapis;

import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.script.Script;
import org.junit.jupiter.api.Test;

import java.io.IOException;
import java.util.concurrent.ExecutionException;

import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;

/**
 * @Description TODO : 您可以创建UpdateRequest并将其发送到客户端：
 * @Author: zj
 * @Date: 10:49 2019/3/8
 * @Version 1.0
 **/
public class UpdateAPI {

    @Test
    public  void  update() throws IOException, ExecutionException, InterruptedException {
        TransportClient client = esClient.getClient();
        //修改index为twitter type为_doc 索引为1 的数据 的user字段为hhh
        //不存在的字段将新增
        UpdateRequest updateRequest=new UpdateRequest();
        updateRequest.index("twitter");
        updateRequest.type("_doc");
        updateRequest.id("1");
        updateRequest.doc(jsonBuilder().startObject().field("user", "male")
                .endObject());
       client.update(updateRequest).get();


        //方法三 更新API允许基于提供的脚本更新文档：
        UpdateRequest updateRequest2 = new UpdateRequest("twitter", "_doc", "1")
                .script(new Script("ctx._source.gender = \"ma1le\""));
        client.update(updateRequest2).get();

        //方法四   字段不存在将新建 可以构造方式传递参数
        UpdateRequest updateRequest3 = new UpdateRequest("twitter", "_doc", "1")
                .doc(jsonBuilder()
                        .startObject()
                        .field("gender", "male2")
                        .endObject());
        client.update(updateRequest3).get();

        //方法二 字段不存在将新建 将合并到现有文档的文档。
        client.prepareUpdate("twitter", "_doc", "1")
                .setDoc(jsonBuilder()
                        .startObject()
                        .field("h", "mawle")
                        .endObject())
                .get();
        //无法同时提供脚本和doc。

        //还有对upsert的支持。 如果文档不存在，则upsert元素的内容将用于索引新文档：两个方法是一个整体
        //如果文档不存在，将添加indexRequest中的文档
        IndexRequest indexRequest = new IndexRequest("hi", "_doc", "1")
                .source(jsonBuilder()
                        .startObject()
                        .field("name", "Joe Smith")
                        .field("gender", "male")
                        .endObject());
        //如果索引存在 这个执行修改操作，如果不存在 则执行新增操作内容为新增的
        UpdateRequest updateRequest4 = new UpdateRequest("hi", "_doc", "1")
                .doc(jsonBuilder()
                        .startObject()
                        .field("gender", "ma2le")
                        .endObject())
                .upsert(indexRequest);
        client.update(updateRequest4).get();
    }

}
